package DAO;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import Model.Esquema;
import Utils.Conexao;
import com.mysql.jdbc.CallableStatement;

public class EsquemaDAO {
	public static void Insert(Esquema esquema) throws SQLException
	{		
		Connection con = Conexao.getConection();		
		String mysqlCall = "call spc_insert_esquema(?, ?, ?, ?, ?)";		
		CallableStatement call = EsquemaDAO.SetObjectCallableStatement(esquema, mysqlCall, con);
		call.execute();
		con.close();		
		call.close();
				
	}	
	
	public static void Update(Esquema esquema) throws SQLException
	{		
		Connection con = Conexao.getConection();		
		String mysqlCall = "call spc_update_esquema(?, ?, ?, ?, ?, ?)";		
		CallableStatement call = EsquemaDAO.SetObjectCallableStatement(esquema, mysqlCall, con);
		call.execute();
		call.close();	
		con.close();		
	}	
	
	
	public static void Delete(int id) throws SQLException
	{
		Connection con = Conexao.getConection();		
		String mysqlCall = "call spc_delete_esquema(?)";
		CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
		call.setInt(1, id);		
		call.execute();		
		call.close();
		con.close();
	}	
	
	public static Esquema LoadObject(int idEsquema) throws SQLException
	{		
		Esquema esquema = null;		
		Connection con = Conexao.getConection();
		String mysqlCall = "call spc_select_esquema_por_id(?)";
		CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
		call.setInt(1, idEsquema);
		ResultSet res = call.executeQuery();
		
		if(res.next())
			esquema = EsquemaDAO.SetInstance(res);		
		
		call.close();
		con.close();
		return esquema;
	}
	
	public static ArrayList<Esquema> GetArrayListEsquema()
	{
		ArrayList<Esquema> arrEsquema = new ArrayList<Esquema>();
		try
		{
			Connection con = Conexao.getConection(); 
			String mysqlCall = "call spc_select_esquemas();" ;						
			
			CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
			ResultSet res = call.executeQuery();
			while(res.next())
			{
				Esquema esquema =  EsquemaDAO.SetInstance(res);
				arrEsquema.add(esquema);
			}			
			call.close();
			con.close();			
		}
		catch(SQLException ex)
		{
			ex.printStackTrace();
		}
		
		return arrEsquema;
	}
	
	public static boolean verificaEsquemaPaciente(int id_paciente)
	{
		int quantidade = 0;
		try {
			Connection con = Conexao.getConection();		
			String mysqlCall = "call spc_select_count_esquema_por_paciente(?);";
			CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
			call.setInt(1, id_paciente);
			ResultSet res = call.executeQuery();			
			
			if(res.next())
				quantidade = res.getInt("quantidade");			
			
			call.close();
			con.close();		
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return quantidade > 0;
		
	}
	
	private static CallableStatement SetObjectCallableStatement(Esquema esquema, String mysqlCall, Connection con ) throws SQLException
	{				
		CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
		call.setDate(1, esquema.getDataInicio());
		call.setDate(2, esquema.getDataFim() );		
		call.setInt(3, esquema.getIdTipoCapilar());
		call.setInt(4, esquema.getIdDiasSessao());		
		call.setInt(5, esquema.getIdPaciente());
		
		if(esquema.getIdEsquema() > 0)
			call.setInt(6, esquema.getIdEsquema());
		
		return call; 		
	}

	
	public static Esquema SetInstance(ResultSet res) throws SQLException
	{
		Esquema esquema = new Esquema();
		esquema.setIdEsquema(res.getInt("id_esquema"));		
		esquema.setDataInicio(res.getDate("data_inicio"));
		esquema.setDataFim(res.getDate("data_fim"));		
		esquema.setIdTipoCapilar(res.getInt("id_tipo_capilar"));
		esquema.setIdPaciente(res.getInt("id_paciente"));
		esquema.setIdDiasSessao(res.getInt("id_dias_sessao"));
		
		esquema.setPaciente(PacienteDAO.LoadObject(res.getInt("id_paciente")));
		esquema.setTipoCapilar(TipoCapilarDAO.LoadObject(res.getInt("id_tipo_capilar")));
		esquema.setDiasSessao(DiasSessaoDAO.LoadObject(res.getInt("id_dias_sessao")));
		return esquema;		
	}
}
